<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

/**
 * @property Doctrine $doctrine Biblioteca ORM
 * Controller para gerenciar suites de teste
 *
 */
class CasoTeste extends AdminController {

    /**
     * Metodo para listar os cadastros
     *
     * @param int $offset Registro inicial
     */
    public function index($page = 0) {
        $findBy = array();
        if (isNotBlank($this->input->post('nome'))) {
            $findBy = array_merge($findBy, array('nome' => $this->input->post('nome')));
        }
        $offset = 0;
        if ($page != 0) {
            $offset = ($page - 1) * LIMITE_PAGINACAO_ADMIN;
        }
        /*
          $lista = $this->doctrine->em->getRepository( 'CasosTestes' )->findBy(
          $findBy,
          NULL,
          LIMITE_PAGINACAO_ADMIN,
          $offset
          );
         */
        $lista = $this->getCasosAgrupados($offset, LIMITE_PAGINACAO_ADMIN);
        if (in_array('Testador', $_SESSION['perfis'])) {
            $this->assign('meus_casos', $this->getMeusCasosTeste());
        }
        $total = count($lista);

        $this->assign('lista', $lista);
        $this->assign('total', $total);

        $this->display('casoteste/index');
    }

    /**
     * Exibe a tela de inserção/alteração
     *
     * @param int 
     */
    public function editar($id = null) {
        if (!empty($id) && $_SERVER['REQUEST_METHOD'] == 'GET') {
            $obj = $this->doctrine->em->getRepository('CasosTestes')->find($id);
            $this->assign('passos', $this->getPassosByCaso($id));
            $testador = $this->getTestadorCasoTeste($id);
            if (!empty($testador)) {
                $this->assign('testador', $testador['nome']);
            }

            // colocamos os dados na variavel $_POST
            $_POST = (array) $obj;

            $this->assign('scripts', $obj->get_scripts());
            $this->assign('logs', $obj->get_logs());
        }

        $this->assign('projetos', $this->getProjetos());
        $this->display('casoteste/editar');
    }

    /**
     * Insere um novo objeto ou altera um existente
     *
     * @param int
     */
    public function salvar($id = null) {
        $dao = new CasosTestes();
        // se está editando (informou o código)
        if (!empty($id)) {
            // pegamos o registro do banco de dados
            $dao = $this->doctrine->em->getRepository('CasosTestes')->find($id);
        }
        populateForm($dao, $this->input->post());
        $this->doctrine->em->persist($dao);
        $this->doctrine->em->flush();
        $this->saveOrUpdateProjetosCasos($dao->get_id_projeto(), $dao->get_id_caso_teste());
        $this->updatePassos($dao->get_id_caso_teste());

        redirect('admin/casoteste/index');
    }

    /**
     * Remove um aluno
     *
     * @param int 
     */
    public function remover($id) {
        if (!empty($id)) {
            // removemos o objeto
            $dao = $this->doctrine->em->getRepository('CasosTestes')->find($id);
            if ($dao != null) {
                $this->doctrine->em->remove($dao);
                $this->doctrine->em->flush();
            }
        }
        redirect('admin/casoteste/index');
    }

    public function getTestadores() {
        $id_caso_teste = $this->input->post('id_caso_teste');
        $testadores = $this->getAllTestadores($id_caso_teste);
        echo json_encode($testadores);
    }

    public function vincularTestador() {
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            $id_caso_teste = $this->input->post('id_caso_teste');
            $id_usuario = $this->input->post('id_usuario');
            if (!empty($id_caso_teste)) {
                $this->setTestador($id_caso_teste, $id_usuario);
                echo json_encode($this->getTestadorCasoTeste($id_caso_teste));
            } else {
                echo json_encode(array('nome' => 'Nenhum testador foi designado'));
            }
        }
    }

    private function getAllTestadores($id_caso_teste) {
        $sql = "SELECT
                        u.id_usuario,
                        p.id_pessoa,
                        concat(p.nome, ' ', p.sobrenome) AS nome,
                    (select ct.id_caso_teste from casos_testes ct where u.id_usuario = ct.id_testador and ct.id_caso_teste = $id_caso_teste) as id_caso_teste

                FROM
                        usuarios u 
                                INNER JOIN pessoas p 
                                ON u.id_pessoa = p.id_pessoa 

                WHERE
                        id_usuario_perfil = 7 
                ORDER BY
                        p.nome";
        $stmt = $this->doctrine->em->getConnection()->prepare($sql);
        $stmt->execute();
        $testadores = $stmt->fetchAll();
        return $testadores;
    }

    /////////////////////////////////////////////////////////////////////////

    private function setTestador($id_caso_teste, $id_usuario) {
        $sql = "update casos_testes set id_testador = $id_usuario WHERE id_caso_teste = $id_caso_teste";
        $stmt = $this->doctrine->em->getConnection()->prepare($sql);
        $stmt->execute();
    }

    private function getTestadorCasoTeste($id_caso_teste) {
        $sql = "select concat(p.nome, ' ', p.sobrenome) as nome from casos_testes ct
                inner join usuarios u
                on ct.id_testador = u.id_usuario
                inner join pessoas p
                on p.id_pessoa = u.id_pessoa
                where ct.id_caso_teste = $id_caso_teste";
        $stmt = $this->doctrine->em->getConnection()->prepare($sql);
        $stmt->execute();
        return $stmt->fetch();
    }

    private function saveOrUpdateProjetosCasos($id_projeto, $id_caso_teste) {
        $sql = "SELECT * FROM projetos_casos WHERE id_caso_teste = $id_caso_teste";
        $stmt = $this->doctrine->em->getConnection()->prepare($sql);
        $stmt->execute();
        $projeto_caso = $stmt->fetchAll();
        if (isNotBlank($projeto_caso) && count($projeto_caso) > 0) {
            // alteração
            $sql = "UPDATE projetos_casos SET id_projeto = $id_projeto WHERE id_caso_teste = $id_caso_teste";
        } else {
            // inserção
            $sql = "INSERT INTO projetos_casos(id_projeto, id_caso_teste) VALUES($id_projeto, $id_caso_teste)";
        }
        $stmt = $this->doctrine->em->getConnection()->prepare($sql);
        $stmt->execute();
    }

    private function updatePassos($id_caso_teste) {
        $this->deletePassos($id_caso_teste);
        $this->insertPassos($id_caso_teste);
    }

    private function deletePassos($id_caso_teste) {
        $sql = "delete from passos WHERE id_caso_teste = $id_caso_teste";
        $stmt = $this->doctrine->em->getConnection()->prepare($sql);
        $stmt->execute();
    }

    private function insertPassos($id_caso_teste) {
        $passos = $this->input->post('passo');
        $resultados = $this->input->post('resultado');
        if (isNotBlank($passos) && count($passos) > 0) {
            foreach ($passos as $key => $val) {
                $passo = $val;
                $resultado = $resultados[$key];
                $sql = "insert into passos(id_caso_teste, descricao, resultado) values ('$id_caso_teste', '$passo', '$resultado')";
                $stmt = $this->doctrine->em->getConnection()->prepare($sql);
                $stmt->execute();
            }
        }
    }

    private function getCasosAgrupados($offset, $limit) {
        $sql = "
                SELECT 
                    st.id_suite_teste, 
                    st.nome, 
                    pr.id_projeto, 
                    CASE 
                        WHEN pr.nome IS NULL
                        THEN 'Nenhum Projeto'
                        ELSE pr.nome
                    END AS nome_projeto, 
                    ct.id_caso_teste, 
                    CASE 
                        WHEN ct.nome IS NULL
                        THEN 'Nenhum Caso de Teste'
                        ELSE ct.nome
                    END AS nome_caso, 
                    ct.data_criacao
                FROM suites_testes st 
                LEFT JOIN projetos pr ON pr.id_suite_teste = st.id_suite_teste
                LEFT JOIN casos_testes ct ON ct.id_projeto = pr.id_projeto
                ORDER BY st.id_suite_teste, st.nome, pr.id_projeto, pr.nome, ct.nome
                LIMIT $offset, $limit
            ";
        $stmt = $this->doctrine->em->getConnection()->prepare($sql);
        $stmt->execute();
        return $stmt->fetchAll();
    }

    private function getMeusCasosTeste() {
        $id_usuario = $_SESSION['usuario']->get_id_usuario();
        $sql = "
                SELECT 
                    st.id_suite_teste, 
                    st.nome, 
                    pr.id_projeto, 
                    CASE 
                        WHEN pr.nome IS NULL
                        THEN 'Nenhum Projeto'
                        ELSE pr.nome
                    END AS nome_projeto, 
                    ct.id_caso_teste, 
                    CASE 
                        WHEN ct.nome IS NULL
                        THEN 'Nenhum Caso de Teste'
                        ELSE ct.nome
                    END AS nome_caso, 
                    ct.data_criacao
                FROM suites_testes st 
                LEFT JOIN projetos pr ON pr.id_suite_teste = st.id_suite_teste
                LEFT JOIN casos_testes ct ON ct.id_projeto = pr.id_projeto
                where ct.id_testador = $id_usuario
                ORDER BY st.id_suite_teste, st.nome, pr.id_projeto, pr.nome, ct.nome
            ";
        $stmt = $this->doctrine->em->getConnection()->prepare($sql);
        $stmt->execute();
        return $stmt->fetchAll();
    }

    private function getPassosByCaso($id_caso_teste) {
        $sql = "select * from passos where id_caso_teste = $id_caso_teste order by id_passo";
        $stmt = $this->doctrine->em->getConnection()->prepare($sql);
        $stmt->execute();
        return $stmt->fetchAll();
    }

    private function getProjetos() {
        $sql = "
            SELECT
                p.nome, p.id_projeto
            FROM
                    projetos p
                inner join suites_testes st
                on p.id_suite_teste = st.id_suite_teste
            ORDER BY
                    p.nome
            ";
        $stmt = $this->doctrine->em->getConnection()->prepare($sql);
        $stmt->execute();
        return $stmt->fetchAll();
    }

}

/* End of file suite.php */
/* Location: ./application/controllers/admin/suite.php */
